package options_pattern

// 函数选项模式（Functional Options Pattern） ，也称为选项模式（Options Pattern），是一种创造性的设计模式，允许你使用接受零个或多个函数作为参数的可变构造函数来构建复杂结构

// 如果需要构造的对象不仅仅是People，或者不明确，可以继续对people再封装一层
type FunctionalDemoApply struct {
	People  *FunctionalDemo
	Address string
}

// 为什么有options，还需要传入name
// 为了保证必传参数，可以在NewPeople中传入name
func NewFunctionalDemoApply(name string, options ...func(apply *FunctionalDemoApply)) *FunctionalDemo {
	p := &FunctionalDemoApply{
		People: &FunctionalDemo{
			Name: name,
		},
	}

	for _, option := range options {
		option(p)
	}
	return p.People
}

func WithAddress(address string) func(apply *FunctionalDemoApply) {
	return func(p *FunctionalDemoApply) {
		if address != "" {
			p.People.Address = address
		}
	}
}
